package com.hitqz.robot.driver.util;

import com.google.common.collect.Sets;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 科聪数据类型
 */
public enum   DataTypeEnum {

    UDINT("UDINT","32位无符号双整型"),

    REAL("REAL","32位浮点型"),

    INT("INT","32位整型"),

    BOOL("BOOL","布尔型")


    ;

    public final static Map<String, DataTypeEnum> MAP = new HashMap<>(20);
    //变量名和数据类型映射
    public final static Map<String, DataTypeEnum> VAR_NAME_ENUM_MAP = new HashMap<>(20);
    //存储需要定期查询的变量名
    public final static Set<String> VAR_NAME_SET = Sets.newHashSet();

    //这个enum的code的映射map
    static {
        for (DataTypeEnum e : DataTypeEnum.values()) {
            MAP.put(e.type, e);
        }
        VAR_NAME_ENUM_MAP.put("cmd_forcedctrl",UDINT);//控制状态
        VAR_NAME_ENUM_MAP.put("cmd_vel_line_x",REAL);//x 线速度
        VAR_NAME_ENUM_MAP.put("cmd_vel_line_y",REAL);//y 线速度
        VAR_NAME_ENUM_MAP.put("cmd_vel_angle",REAL); //角速度
        VAR_NAME_ENUM_MAP.put("cmd_heartbeat",UDINT);//控制速度的心跳，没有则会强制速度置0
        VAR_NAME_ENUM_MAP.put("cmd_a_charge",INT);//无线充电命令 0-取消充电 1-开始充电
        VAR_NAME_ENUM_MAP.put("cmd_lifter",INT);//顶升
        VAR_NAME_ENUM_MAP.put("cmd_lifter_f",INT);//顶升--双轮对 前
        VAR_NAME_ENUM_MAP.put("cmd_lifter_b",INT);//顶升--双轮对 后
        VAR_NAME_ENUM_MAP.put("cmd_enable_up",BOOL);// 前顶升找轮对
        VAR_NAME_ENUM_MAP.put("cmd_enable_45",BOOL);// 上顶升找轮对
        VAR_NAME_ENUM_MAP.put("cmd_button_stop",UDINT);// 急停按钮
        VAR_NAME_ENUM_MAP.put("cmd_BatteryZero",INT);// 强制电量为0

        // 状态
        //VAR_NAME_ENUM_MAP.put("rep_m_charge",BOOL);//手动充电命令 0-空闲 1-充电中
        //VAR_NAME_ENUM_MAP.put("rep_lyny_v",REAL);//充电电压
        //VAR_NAME_ENUM_MAP.put("rep_lyny_i",REAL);//充电电流
        //VAR_NAME_ENUM_MAP.put("rep_lyny_t",REAL);//设备温度
        //VAR_NAME_ENUM_MAP.put("rep_lyny_rs",INT);//充电状态 0-未充电 1-充电段涓流 2-充电段恒流 3-充电段恒压
        //VAR_NAME_ENUM_MAP.put("rep_lyny_e",INT);//故障码
        //VAR_NAME_ENUM_MAP.put("rep_lyny_ss",INT); //系统状态 0-未充电 1-辅助对准 2-正在充电 3-关机中 4-保护中
        VAR_NAME_ENUM_MAP.put("rep_emergency_f",BOOL); //前防撞条出发情况 1触发
        VAR_NAME_ENUM_MAP.put("rep_emergency_b",BOOL); //后防撞条触发情况 1触发
        VAR_NAME_ENUM_MAP.put("rep_emergency_s",BOOL); //急停按钮触发情况 1触发
        VAR_NAME_ENUM_MAP.put("rep_motor_ok",BOOL); //电机初始化情况 1成功
        //VAR_NAME_ENUM_MAP.put("rep_Cam_X",INT); //二维码X
        //VAR_NAME_ENUM_MAP.put("rep_Cam_Y",INT); //二维码Y
        //VAR_NAME_ENUM_MAP.put("rep_Cam_Z",REAL); //二维码Z

        VAR_NAME_ENUM_MAP.put("rep_f_l_status", INT); //顶升状态-前

        //VAR_NAME_ENUM_MAP.put("rep_b_l_status", INT); //顶升状态--后
        //VAR_NAME_ENUM_MAP.put("rep_f_l_get_m", INT); //顶升距离
        //VAR_NAME_ENUM_MAP.put("rep_b_l_get_m", INT); //顶升距离

        VAR_NAME_ENUM_MAP.put("rep_up_io", BOOL); //顶升传感器
        VAR_NAME_ENUM_MAP.put("rep_up_io_f", BOOL); //双轮对-前升传感器
        VAR_NAME_ENUM_MAP.put("rep_up_io_b", BOOL); //双轮对-后升传感器

        VAR_NAME_ENUM_MAP.put("rep_front_io", BOOL); //顶升前距离
        VAR_NAME_ENUM_MAP.put("rep_back_io", BOOL); //顶升后距离
        VAR_NAME_ENUM_MAP.put("rep_up_io_flag", BOOL); //顶升后距离
        VAR_NAME_ENUM_MAP.put("rep_45_io_flag", BOOL); //顶升后距离

        VAR_NAME_ENUM_MAP.put("rep_L_F_EC", INT); //顶升故障码

        VAR_NAME_ENUM_MAP.put("rep_L_B_EC", INT); //顶升故障码


        VAR_NAME_ENUM_MAP.put("repCurPathPoint", UDINT); //. 当前路径点


        VAR_NAME_ENUM_MAP.put("repNaviStatus", INT); // 当前导航状态--(混合/激光都行)


        VAR_NAME_ENUM_MAP.put("repNaviGoalID", UDINT); // 当前目标点
        //
        VAR_NAME_ENUM_MAP.put("rep_next_step", UDINT); // 调度执行下一个任务
        VAR_NAME_ENUM_MAP.put("cmd_next_step", UDINT); // 调度允许执行下一个任务

        // 叉车
        VAR_NAME_ENUM_MAP.put("Lift_TaskCtrl", INT); // 任务指令
        VAR_NAME_ENUM_MAP.put("Lift_Cod", INT); // 当前目标点
        VAR_NAME_ENUM_MAP.put("LIft_Height", REAL); // 当前目标点
        VAR_NAME_ENUM_MAP.put("Lift_State", INT); // 当前目标点



        // 顶升状态，



        // 需要定时查询的状态变量
        VAR_NAME_ENUM_MAP.keySet().stream().filter(
                // 排除掉不需要定时查询的变量
                name-> !name.contains("cmd")
        ).forEach(VAR_NAME_SET::add);

    }



    private final String type;
    private final String desc;

    DataTypeEnum(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }

    public String getType() {
        return type;
    }

    public String getDesc() {
        return desc;
    }
}
